home *** CD-ROM | disk | FTP | other *** search
/ Assassins - Ultimate CD Games Collection 4 / Assassins 4 (1999)(Weird Science).iso / misc / omega / source / char.c < prev    next >
C/C++ Source or Header  |  1997-05-02  |  15KB  |  584 lines

  1. /* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
  2. /* char.c */
  3. /* Player generation */
  4.  
  5. #ifndef MSDOS
  6. #include <sys/types.h>
  7. #include <unistd.h>
  8. #include <pwd.h>
  9. #endif
  10.  
  11. #include "glob.h"
  12.  
  13. /* set player to begin with */
  14. void initplayer()
  15. {
  16.   int i;
  17.   int oldchar=FALSE;
  18.   FILE *fd;
  19.   char *lname;
  20. #ifndef MSDOS
  21.   struct passwd *dastuff;
  22. #endif
  23.  
  24.   lname = getlogin();
  25. #ifndef MSDOS
  26. #ifndef AMIGA
  27.   if (!lname || strlen(lname) == 0)
  28.   {
  29.        dastuff = getpwuid(getuid());
  30.        lname = dastuff->pw_name;
  31.   }
  32. #endif
  33. #endif
  34.   strcpy(Player.name,lname);
  35.   if (Player.name[0] >= 'a' && Player.name[0] <= 'z')
  36.        Player.name[0] += 'A'-'a'; /* capitalise 1st letter */
  37.   Player.itemweight = 0;
  38.   Player.food = 36; 
  39.   Player.packptr = 0;
  40.   Behavior = -1;
  41.   Player.options = 0;
  42.   for (i=0;i<MAXITEMS;i++)
  43.     Player.possessions[i] = NULL;
  44.   for (i=0;i<MAXPACK;i++)
  45.     Player.pack[i] = NULL;
  46.   for (i=0;i<NUMIMMUNITIES;i++) Player.immunity[i] = 0;
  47.   for (i=0;i<NUMSTATI;i++) Player.status[i] = 0;
  48.   for (i=0;i<NUMRANKS;i++) {
  49.     Player.rank[i] = 0;
  50.     Player.guildxp[i] = 0;
  51.   }
  52.   Player.patron = 0;
  53.   Player.alignment = 0;
  54.   Player.cash = 250;
  55.   change_to_user_perms();
  56.   if ((fd=omegarc_check())!=NULL) {
  57.     fread((char *)&i,sizeof(int),1,fd);
  58.     if (i != VERSION) {
  59. #if defined(MSDOS) || defined(AMIGA)
  60.       print1("Out of date omega.rc! Make another!");
  61. #else
  62.       print1("Out of date .omegarc! Make another!");
  63. #endif
  64.       morewait();
  65.     }
  66.     else {
  67.       oldchar = TRUE;
  68.       fread((char *)&Player,sizeof(Player),1,fd);
  69.       fread((char *)&Searchnum,sizeof(int),1,fd);
  70.       fread((char *)&Verbosity,sizeof(char),1,fd);
  71.       strcpy(Player.name,lname);
  72.       if (Player.name[0] >= 'a' && Player.name[0] <= 'z')
  73.        Player.name[0] += 'A'-'a'; /* capitalise 1st letter */
  74.     }
  75.     fclose(fd);
  76.   }
  77.   change_to_game_perms();
  78.   if (! oldchar) {
  79.     optionset(RUNSTOP);
  80.     optionset(CONFIRM);
  81. #ifdef COMPRESS_SAVE_FILES
  82.     optionset(COMPRESS_OPTION);
  83. #endif
  84. #if defined(MSDOS) || defined(AMIGA)
  85.     optionset(SHOW_COLOUR);
  86. #endif
  87.     initstats();
  88.   }
  89.   Searchnum = max(1,min(9,Searchnum));
  90.   Player.hp = Player.maxhp = Player.maxcon;
  91.   Player.mana = Player.maxmana = calcmana();
  92.   Player.click = 1;
  93.   strcpy(Player.meleestr,"CCBC");
  94.   calc_melee();
  95.   ScreenOffset = -1000;    /* to force a redraw */
  96. }
  97.  
  98.  
  99. FILE *omegarc_check()
  100. {
  101.   FILE *fd;
  102. #if defined(MSDOS) || defined(AMIGA)
  103.   if ((fd = fopen("omega.rc","rb")) != NULL) {
  104.     print2("Use omega.rc in current directory? [yn] ");
  105. #else
  106.   sprintf(Str1, "%s/.omegarc", getenv("HOME"));
  107.   if ((fd = fopen(Str1,"r")) != NULL) {
  108.     print2("Use .omegarc in home directory? [yn] ");
  109. #endif
  110.     if (ynq2()!='y') {
  111.       fclose(fd);
  112.       fd = NULL;
  113.     }
  114.   }
  115.   clearmsg();
  116.   return(fd);
  117. }
  118.  
  119. void initstats()
  120. {
  121.   char response;
  122.   print1("Do you want to run a character [c] or play yourself [p]?");
  123.   do response = (char) mcigetc(); while ((response!='c')&&(response != 'p'));
  124.   if (response == 'c') omegan_character_stats();
  125.   else {
  126.     user_character_stats();
  127.     user_intro();
  128. #if defined(MSDOS) || defined(AMIGA)
  129.     print1("Do you want to save this set-up to omega.rc in this directory? [yn] ");
  130. #else
  131.     print1("Do you want to save this set-up to .omegarc in your home directory? [yn] ");
  132. #endif
  133.     if (ynq1()=='y')
  134.       save_omegarc();
  135.   }
  136.   xredraw();
  137. }
  138.  
  139. void save_omegarc()
  140. {
  141.   int i=VERSION;
  142.   FILE *fd;
  143.   change_to_user_perms();
  144. #if defined(MSDOS) || defined(AMIGA)
  145.   fd = fopen("omega.rc","wb");
  146. #else
  147.   sprintf(Str1, "%s/.omegarc", getenv("HOME"));
  148.   fd = fopen(Str1,"w");
  149. #endif
  150.   if (fd == NULL)
  151. #if defined(MSDOS) || defined(AMIGA)
  152.     print1("Sorry, couldn't save omega.rc for some reason.");
  153. #else
  154.     print1("Sorry, couldn't save .omegarc for some reason.");
  155. #endif
  156.   else {
  157.     fwrite((char *)&i,sizeof(int),1,fd);
  158.     print1("First, set options.");
  159.     setoptions();
  160.     fwrite((char *)&Player,sizeof(Player),1,fd);
  161.     fwrite((char *)&Searchnum,sizeof(int),1,fd);
  162.     fwrite((char *)&Verbosity,sizeof(char),1,fd);
  163.     fclose(fd);
  164.   }
  165.   change_to_game_perms();
  166. }
  167.  
  168.  
  169.  
  170. long calcmana()
  171. {
  172.   return(Player.pow * (long)(Player.level+1));
  173. }
  174.  
  175.  
  176. /*  npcbehavior digits 1234
  177.  
  178. 4 : alignment (LAWFUL,CHAOTIC, or NEUTRAL)
  179. 3 : primary combat action (melee,missile,spell,thief,flight,1..5)
  180. 2 : competence at 4 (0..9, 0 = incompetent, 9 = masterful)
  181. 1 : conversation mode
  182.  
  183. status : 1 = dead, 2 = saved, 3 = retired, 4 = still playing
  184. */
  185. int fixnpc(status)
  186. int status;
  187. {
  188.   int npcbehavior=0;
  189.   char response;
  190.   if (status == 1) { /* player is dead, all undead are chaotic */
  191.     npcbehavior+=CHAOTIC;
  192.     npcbehavior+=10; /* melee */
  193.     npcbehavior+=100*min(9,((int) (Player.level/3)));
  194.     npcbehavior+=1000; /* threaten */
  195.   }
  196.   else if (Behavior >= 0)
  197.     npcbehavior = Behavior;
  198.   else {
  199.     menuclear();
  200.     menuprint("NPC Behavior Determination Module\n\n");
  201.     menuprint("Your overall NPC behavior is:");
  202.     if (Player.alignment < -10) {
  203.       npcbehavior += CHAOTIC;
  204.       menuprint("\n\n CHAOTIC");
  205.     }
  206.     else if (Player.alignment > 10) {
  207.       npcbehavior += LAWFUL;
  208.       menuprint("\n\n LAWFUL");
  209.     }
  210.     else {
  211.       npcbehavior += NEUTRAL;
  212.       menuprint("\n\n NEUTRAL");
  213.     }
  214.     menuprint("\n\n1: hand-to-hand combat");
  215.     menuprint("\n2: missile combat");
  216.     menuprint("\n3: spellcasting");
  217.     menuprint("\n4: thieving");
  218.     menuprint("\n5: escape");
  219.     menuprint("\n\nEnter NPC response to combat: ");
  220.     showmenu();
  221.     response = '0';
  222.     while ((response != '1') && 
  223.        (response != '2') &&
  224.        (response != '3') &&
  225.        (response != '4') &&
  226.        (response != '5'))
  227.       response = menugetc();
  228.     menuaddch(response);
  229.     npcbehavior+=10*(response - '0');
  230.     npcbehavior+=100*competence_check(response-'0');
  231.     response = '0';
  232.     menuclear();
  233.     menuprint("1: threaten");
  234.     menuprint("\n2: greet");
  235.     menuprint("\n3: aid");
  236.     menuprint("\n4: beg");
  237.     menuprint("\n5: silence");
  238.     menuprint("\n\nEnter NPC response to conversation: ");
  239.     showmenu();
  240.     while ((response != '1') && 
  241.        (response != '2') &&
  242.        (response != '3') &&
  243.        (response != '4') &&
  244.        (response != '5'))
  245.       response = menugetc();
  246.     menuaddch(response);
  247.     npcbehavior+=1000*(response - '0');
  248.     xredraw();
  249.   }
  250.   Behavior = npcbehavior;
  251.   return(npcbehavior);
  252. }
  253.  
  254.  
  255. /* estimates on a 0..9 scale how good a player is at something */
  256. int competence_check(attack)
  257. int attack;  
  258. {
  259.   int ability = 0;
  260.   switch(attack) {
  261.   case 1: /* melee */
  262.     ability += statmod(Player.str);
  263.   case 2: /* missle */
  264.     ability += statmod(Player.dex);
  265.     ability += Player.rank[LEGION];
  266.     ability += ((int) (Player.dmg / 10) - 1);
  267.     break;
  268.   case 3: /* spellcasting */
  269.     ability += statmod(Player.iq);
  270.     ability += statmod(Player.pow);
  271.     ability += Player.rank[CIRCLE];
  272.     ability += Player.rank[COLLEGE];
  273.     ability += Player.rank[PRIEST];
  274.     break;
  275.   case 4: /* thieving */
  276.     ability += statmod(Player.dex);
  277.     ability += statmod(Player.agi);
  278.     ability += Player.rank[THIEVES];
  279.     break;
  280.   case 5: /* escape */
  281.     ability += 2 * statmod(Player.agi);
  282.     break;
  283.   }
  284.   ability += ((int) (Player.level / 5));
  285.   if (ability < 0) ability = 0;
  286.   if (ability > 9) ability = 9;
  287.   return(ability);
  288. }
  289.  
  290. void user_character_stats()
  291. {
  292.   int num,iqpts=0,numints=0,ok,agipts=0,dexpts=0,powpts=0,conpts=0;
  293.   print1("OK, now try to answer the following questions honestly:");
  294.   morewait();
  295.   print1("How many pounds can you bench press? ");
  296.   num = (int) parsenum();
  297.   if (num < 30) Player.str = Player.maxstr = 3;
  298.   else if (num < 90) Player.str = Player.maxstr = num/10;
  299.   else Player.str = Player.maxstr = 9+((num-120)/30);
  300.   if (Player.str > 18) {
  301.     print2("Even if it's true, I don't believe it.");
  302.     morewait();
  303.     clearmsg();
  304.     Player.str = Player.maxstr = 18;
  305.   }
  306.   
  307.   print1("Took an official IQ test? [yn] ");
  308.   if (ynq1()=='y') {
  309.     print1("So, whadja get? ");
  310.     num = (int) parsenum()/10;
  311.     if (num > 18) {
  312.       print2("Even if it's true, I don't believe it.");
  313.       morewait();
  314.       clearmsg();
  315.       num = 18;
  316.     }
  317.     iqpts+=num;
  318.     numints++;
  319.   }
  320.  
  321.   print1("Took Undergraduate entrance exams? [yn] ");
  322.   if (ynq1()=='y') {
  323.     do {
  324.       print1("So, what percentile? ");
  325.       num = (int) parsenum();
  326.       ok = (num < 100);
  327.       if (! ok) {
  328.     print2("That's impossible!");
  329.     morewait();
  330.     clearmsg();
  331.       }
  332.     } while (! ok);
  333.     iqpts += (num - 49)*9/50 + 9;
  334.     numints++;
  335.   }
  336.   print1("Took Graduate entrance exams? [yn] ");
  337.   if (ynq1()=='y') {
  338.     do {
  339.       print1("So, what percentile? ");
  340.       num = (int) parsenum();
  341.       ok = (num < 100);
  342.       if (! ok) {
  343.     print2("That's impossible!");
  344.     morewait();
  345.     clearmsg();
  346.       }
  347.     } while (! ok);
  348.     iqpts += (num - 49)*9/50 + 9;
  349.     numints++;
  350.   }
  351.  
  352.   if (numints == 0) {
  353.     print1("Pretty dumb, aren't you? [yn] ");
  354.     if (ynq1()=='y') {
  355.       Player.iq = random_range(3)+3;      
  356.       print2("I thought so....");
  357.     }
  358.     else {
  359.       Player.iq = random_range(6)+8;
  360.       print2("Well, not *that* dumb.");
  361.     }
  362.     morewait();
  363.     clearmsg();
  364.   }
  365.   else Player.iq = iqpts/numints;
  366.   Player.maxiq = Player.iq;
  367.   agipts = 0;
  368.   print1("Can you dance? [yn] ");
  369.   if (ynq1()=='y') {
  370.     agipts++;
  371.     nprint1(" Well? [yn] ");
  372.     if (ynq1()=='y') agipts+=2;
  373.   }
  374.   print1("Do you have training in a martial art or gymnastics? [yn] ");
  375.   if (ynq1()=='y') {
  376.     agipts+=2;
  377.     print2("Do you have dan rank or equivalent? [yn] ");
  378.     if (ynq2()=='y') agipts+=4;
  379.   }
  380.   clearmsg();
  381.   print1("Do you play some field sport? [yn] ");
  382.   if (ynq1()=='y') {
  383.     agipts++;
  384.     nprint1(" Are you good? [yn] ");
  385.     if (ynq1()=='y') agipts++;
  386.   }
  387.   print1("Do you cave, mountaineer, etc.? [yn] ");
  388.   if (ynq1()=='y')
  389.     agipts+=3;
  390.   print1("Do you skate or ski? [yn] ");
  391.   if (ynq1()=='y') {
  392.     agipts+=2;
  393.     nprint1(" Well? [yn] ");
  394.     if (ynq1()=='y') agipts+=2;
  395.   }
  396.   print1("Are you physically handicapped? [yn] ");
  397.   if (ynq1()=='y')
  398.     agipts-=4;
  399.   print1("Are you accident prone? [yn] ");
  400.   if (ynq1()=='y')
  401.     agipts-=4;
  402.   print1("Can you use a bicycle? [yn] ");
  403.   if (ynq1()!='y')
  404.     agipts-=4;
  405.   Player.agi = Player.maxagi = 9 + agipts/2;
  406.   print1("Do you play video games? [yn] ");
  407.   if (ynq1()=='y') {
  408.     dexpts+=2;
  409.     print2("Do you get high scores? [yn] ");
  410.     if (ynq2()=='y') dexpts+=4;
  411.   }
  412.   clearmsg();
  413.   print1("Are you an archer, fencer, or marksman? [yn] ");
  414.   if (ynq1()=='y') {
  415.     dexpts+=2;
  416.     print2("A good one? [yn] ");
  417.     if (ynq2()=='y') dexpts+=4;
  418.   }
  419.   clearmsg();
  420.   print1("Have you ever picked a lock? [yn] ");
  421.   if (ynq1()=='y') {
  422.     dexpts+=2;
  423.     print2("Really. Well, the police are being notified.");
  424.   }
  425.   morewait();
  426.   clearmsg();
  427.   print1("What's your typing speed (words per minute) ");
  428.   num = (int) parsenum();
  429.   if (num > 125) {
  430.     print2("Tell me another one....");
  431.     morewait();
  432.     clearmsg();
  433.     num = 125;
  434.   }
  435.   dexpts += num/25;
  436.   print1("Hold your arm out. Tense your fist. Hand shaking? [yn] ");
  437.   if (ynq1()=='y')
  438.     dexpts-=3;
  439.   print1("Ambidextrous, are you? [yn] ");
  440.   if (ynq1()=='y')
  441.     dexpts+=4;
  442.   print1("Can you cut a deck of cards with one hand? [yn] ");
  443.   if (ynq1()=='y')
  444.     dexpts+=2;
  445.   print1("Can you tie your shoes blindfolded? [yn] ");
  446.   if (ynq1()!='y')
  447.     dexpts-=3;
  448.   Player.dex = Player.maxdex = 6 + dexpts/2;
  449.   print1("Do you ever get colds? [yn] ");
  450.   if (ynq1()!='y') 
  451.     conpts+=4;
  452.   else {
  453.     nprint1(" Frequently? [yn] ");
  454.     if (ynq1() == 'y') conpts -=4;
  455.   }
  456.   print1("Had any serious accident or illness this year? [yn] ");
  457.   if (ynq1()=='y') conpts -=4;
  458.   else conpts +=4;
  459.   print1("Have a chronic disease? [yn] ");
  460.   if (ynq1() =='y') conpts -=4;
  461.   print1("Overweight or underweight by more than 20 percent? [yn] ");
  462.   if (ynq1() =='y') conpts -=2;
  463.   print1("High Blood Pressure? [yn] ");
  464.   if (ynq1() =='y') conpts -=2;
  465.   print1("Smoke? [yn] ");
  466.   if (ynq1() =='y') conpts -=3;
  467.   print1("Take aerobics classes? [yn] ");
  468.   if (ynq1() =='y') conpts +=2;
  469.   print1("How many miles can you run? ");
  470.   num = (int) parsenum();
  471.   if (num > 25) {
  472.     print2("Right. Sure. Give me a break.");
  473.     morewait();
  474.     clearmsg();
  475.     conpts += 8;
  476.   }
  477.   else if (num < 1) conpts -= 3;
  478.   else if (num < 5) conpts += 2;
  479.   else if (num < 10) conpts += 4;
  480.   else conpts += 8;
  481.   Player.con = Player.maxcon = 12 + conpts/3;
  482.   print1("Do animals react oddly to your presence? [yn] ");
  483.   if (ynq1()=='y') {
  484.     print2("How curious that must be.");
  485.     morewait();
  486.     clearmsg();
  487.     powpts += 2;
  488.   }
  489.   print1("Can you see auras? [yn] ");
  490.   if (ynq1()=='y') {
  491.     nprint1(" How strange.");
  492.     morewait();
  493.     powpts += 3;
  494.   }
  495.   print1("Ever have an out-of-body experience? [yn] ");
  496.   if (ynq1()=='y') {
  497.     print2("Wow, man. Fly the friendly skies....");
  498.     morewait();
  499.     clearmsg();
  500.     powpts += 3;
  501.   }
  502.   print1("Did you ever cast a spell? [yn] ");
  503.   if (ynq1()=='y') {
  504.     powpts += 3;
  505.     nprint1(" Did it work? [yn] ");
  506.     if (ynq1()=='y') {
  507.       powpts+=7;
  508.       print2("Sure it did.");
  509.       morewait();
  510.       clearmsg();
  511.     }
  512.   }
  513.   print1("Do you have ESP? [yn] ");
  514.   if (ynq1()=='y') {
  515.     powpts += 3;
  516.     print2("Somehow, I knew you were going to say that.");
  517.     morewait();
  518.     clearmsg();
  519.   }
  520.   print1("Do you have PK? [yn] ");
  521.   if (ynq1()=='y') {
  522.     powpts+= 6;
  523.     print2("I can't tell you how much that moves me.");
  524.     morewait();
  525.     clearmsg();
  526.   }
  527.   print1("Do you believe in ghosts? [yn] ");
  528.   if (ynq1()=='y') {
  529.     powpts+=2;
  530.     print2("I do! I do! I do believe in ghosts!");
  531.     morewait();
  532.     clearmsg();
  533.   }
  534.   print1("Are you Irish? [yn] ");
  535.   if (ynq1()=='y') {
  536.     powpts+=2;
  537.     nprint1(" Is that blarney or what?");
  538.     morewait();
  539.   }
  540.   Player.pow = Player.maxpow = 3 + powpts/2;
  541.   print1("Are you sexually interested in males or females? [mf] ");
  542.   do Player.preference = (char) mcigetc();
  543.   while ((Player.preference != 'm') && (Player.preference != 'f') &&
  544.     (Player.preference != 'y') && (Player.preference != 'n')); /* :-) */
  545. }
  546.  
  547.  
  548.  
  549. void omegan_character_stats()
  550. {
  551.   int share1,share2,i=0;
  552.   print1("To reroll hit ESCAPE; hit any other key to accept these stats.");
  553.   do {
  554.     i++;
  555.     sprintf(Str1, "You have only %d chance%s to reroll... ", 11 - i,
  556.     (i == 10) ? "":"s");
  557.     print2(Str1);
  558.     Player.iq = Player.maxiq = 4 + random_range(5)+
  559.       (share1 = random_range(6)) + (share2 = random_range(6));
  560.     Player.pow = Player.maxpow = 4 + random_range(5) + share1 +share2;
  561.     Player.dex = Player.maxdex = 4 + random_range(5)+
  562.       (share1 = random_range(6)) + (share2 = random_range(6));
  563.     Player.agi = Player.maxagi = 4 + random_range(5) + share1 +share2;
  564.     Player.str = Player.maxstr = 4 + random_range(5)+
  565.       (share1 = random_range(6)) + (share2 = random_range(6));
  566.     Player.con = Player.maxcon = 4 + random_range(5) + share1 +share2;
  567.     Player.cash = random_range(100)+random_range(100)+
  568.       random_range(100)+random_range(100)+random_range(100);
  569.     calc_melee();
  570.     dataprint();
  571.   } while ((i < 11) && (mgetc() == ESCAPE));
  572.   clearmsg();
  573.   print1("Please enter your character's name: ");
  574.   strcpy(Player.name,msgscanstring());
  575.   if (Player.name[0] >= 'a' && Player.name[0] <= 'z')
  576.     Player.name[0] += 'A'-'a'; /* capitalise 1st letter */
  577.   print1("Is your character sexually interested in males or females? [mf] ");
  578.   do Player.preference = (char) mcigetc();
  579.   while ((Player.preference != 'm') && (Player.preference != 'f') &&
  580.     (Player.preference != 'y') && (Player.preference != 'n')); /* :-) */
  581.  
  582. }
  583.  
  584.